﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.Infra.Service.Data;
using System.Data.Common;
using System.Data;

namespace Sinacor.Infra.Service.Resources
{
    /// <summary>
    /// Classe para captura de resources
    /// </summary>
    public static class ResourceManager
    {
        private const string RESOURCEKEY_NOT_FOUND = "The resource key '{0}' could not be found.";

        #region GetResource
        /// <summary>
        /// Captura um resource a partir da chave
        /// </summary>
        /// <param name="key">Chave do resource</param>
        /// <param name="throwException">Indica se deve disparar uma exceção se não encontrar o resource</param>
        /// <param name="parameters">Parâmetros para formatar o resource</param>
        /// <returns>Resource encontrado</returns>
        private static string GetResource(string key, bool throwException, params string[] parameters)
        {
            if (string.IsNullOrEmpty(key))
                throw new ArgumentNullException("key");

            string resource = null;
            string query = "SELECT * FROM TFWMENSAGEM M WHERE M.RESOURCEKEY = :resourceKey";

            using (OracleDataBase db = new OracleDataBase())
            {
                using (DbCommand command = db.GetSqlStringCommand(query))
                {
                    db.AddInParameter(command, "resourceKey", DbType.String, key);

                    using (IDataReader reader = db.ExecuteReader(command))
                    {
                        if (reader.Read())
                        {
                            resource = reader.GetValue<string>("MENSAGEMEXCECAO");
                        }
                    }
                }
            }

            if (string.IsNullOrEmpty(resource))
            {
                if (throwException)
                    throw new ArgumentException(string.Format(RESOURCEKEY_NOT_FOUND, key), "key");
            }
            else if (parameters.Length > 0)
            {
                resource = string.Format(resource, parameters);
            }

            return resource;
        }

        /// <summary>
        /// Captura um resource a partir da chave, dispara uma exceção se não encontrar
        /// </summary>
        /// <param name="key">Chave do resource</param>
        /// <returns>Resource encontrado</returns>
        public static string GetResource(string key)
        {
            return GetResource(key, true);
        }

        /// <summary>
        /// Captura um resource a partir da chave e formata o retorno com os parâmetros, dispara uma exceção se não encontrar
        /// </summary>
        /// <param name="key">Chave do resource</param>
        /// <param name="parameters">Parâmetros para formatar o resource</param>
        /// <returns>Resource encontrado</returns>
        public static string GetResource(string key, params string[] parameters)
        {
            return GetResource(key, true, parameters);
        }
        #endregion

        #region TryGetResource
        /// <summary>
        /// Captura um resource a partir da chave, retorna uma mensagem de erro se não encontrar
        /// </summary>
        /// <param name="key">Chave do resource</param>
        /// <returns>Resource encontrado</returns>
        public static string TryGetResource(string key)
        {
            string resource = GetResource(key, false);

            if (string.IsNullOrEmpty(resource))
                resource = string.Format(RESOURCEKEY_NOT_FOUND, key);

            return resource;
        }

        /// <summary>
        /// Captura um resource a partir da chave e formata o retorno com os parâmetros, retorna uma mensagem de erro se não encontrar
        /// </summary>
        /// <param name="key">Chave do resource</param>
        /// <param name="parameters">Parâmetros para formatar o resource</param>
        /// <returns>Resource encontrado</returns>
        public static string TryGetResource(string key, params string[] parameters)
        {
            string resource = GetResource(key, false, parameters);

            if (string.IsNullOrEmpty(resource))
                resource = string.Format(RESOURCEKEY_NOT_FOUND, key);

            return resource;
        }
        #endregion

        #region ResourceExists
        /// <summary>
        /// Verifica se um resource existe
        /// </summary>
        /// <param name="key">Chave do resource</param>
        /// <returns>True se encontrar o resource</returns>
        public static bool ResourceExists(string key)
        {
            return !string.IsNullOrEmpty(GetResource(key, false));
        }
        #endregion
    }
}
